#ifndef _ROUTE_HPP_

#define _ROUTE_HPP_

#include <vector>
#include <sys/types.h>
#include <sys/socket.h>
#include "InetAddr.hpp"
#include "log.hpp"

// 在线用户(群聊)
namespace RouteModule
{
class Route
{
    private:
        bool Is_Exist(const InetAddrModule::InetAddr& addr)
        {
            LogSpace::Logger::LogMessage(LogSpace::LogLevel::INFO,"find",1,LogSpace::log) << "查询对应的用户。";
            for(auto& online_user : _online_user)
            {
                if(online_user == addr)
                {
                    return true;
                }
            }

            return false;
        }
        void AddUser(InetAddrModule::InetAddr& addr)
        {
            LogSpace::Logger::LogMessage(LogSpace::LogLevel::INFO,"find",1,LogSpace::log) << "添加对应的用户。";
            _online_user.emplace_back(addr);
        }
        void DelUer(const InetAddrModule::InetAddr& addr)
        {
            for(auto iter = _online_user.begin();iter != _online_user.end();++iter)
            {
                if(*iter == addr)
                {
                    LogSpace::Logger::LogMessage(LogSpace::LogLevel::INFO,"delete",1,LogSpace::log) << "删除一个用户";
                    _online_user.erase(iter);
                    break;
                }
            }
        }
    public:
        Route()
        {
            ;
        }
        ~Route()
        {
            ;
        }
        void MessageRoute(int sockfd, const std::string &message,InetAddrModule::InetAddr& addr)
        {
            std::cout << "群聊建立" << std::endl;
            // 判断是否存在，不存在添加。
            if(Is_Exist(addr) == false)
            {
                AddUser(addr);
            }

            std::string str = addr.Name() + " #" + message;
            
            for(auto& online_user : _online_user)
            {
                sendto(sockfd,str.c_str(),str.size(),0,(const struct sockaddr *)&(online_user.Addr()),sizeof(online_user.Addr()));
            }
            //sendto(sockfd,str.c_str(),str.size(),0,(const struct sockaddr *)&addr,sizeof(addr));

            // 将消息发在服务器上，处理。
            std::cout << str << std::endl;

            if(message == "QUIT")
            {
                LogSpace::Logger::LogMessage(LogSpace::LogLevel::INFO,"delete",1,LogSpace::log) << "删除一个在线用户";
                DelUer(addr);
            }
        }
    private:
        // 其实可以考虑使用set存储，查找去重更方便，删除也好删。
        std::vector<InetAddrModule::InetAddr> _online_user;
};
}

#endif